package de.fhhannover.inform.wari.grp8.gui;

import java.awt.Color;
import java.io.IOException;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JOptionPane;

import de.fhhannover.inform.studienklassen.semester3.GeneralStatics;
import de.fhhannover.inform.wari.grp8.spiel.*;

/**
 * 
 * @author Oleg Starodubtsev erstellt am 10.11.08 updatetd on 18.11.08 by
 *         michael antemann. imlementierung der update methode und saveprev
 *         update 09.12.08 dispose von new game popup nach oben gesetzt, für ki
 *         gegen ki spiele
 */
public class Gui_Controller extends Thread implements Observer {
	private double version = 1.1;
	private GameFlow mFlow = new GameFlow();
	private LoggerGui logGui;
	private HelpMenu mHM; // Sofia
	private Gui mGui;
	private NewGamePopupDialog mNgpd;
	private Menu mMenu;
	private StrategyGui strGuiA = new StrategyGui("A", this);
	private StrategyGui strGuiB = new StrategyGui("B", this);

	// Esan
	public Gui_Controller(GameFlow sfluss, int time_delay) {
		super();
		mGui = new Gui(this, "Wari Gruppe8", time_delay);
		mFlow = sfluss;
		// this.run();
		// mFlow.getBoard().addObserver(this);
		initGui_Controller();
		mGui.setMenu(mMenu);
		mGui.setVisible(true);
	}

	public void initGui_Controller() {
		mMenu = new Menu(this);
		// mNgpd = new NewGamePopupDialog(this);
		mHM = new HelpMenu(this);
		try {
			logGui = new LoggerGui();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	public void newGame() {
		// mNgpd = new NewGamePopupDialog(this, mFlow.getNameA(),
		// mFlow.getNameB(), mFlow.getKiAName(), mFlow.getKiBName());
		mNgpd = new NewGamePopupDialog(this, "SpielerA", "SpielerB", mFlow
				.getKiAName(), mFlow.getKiBName());
		mNgpd.setVisible(true);
		mGui.setStatusMsg(" :: Spieleinstellungen vornehmen");
	}

	public void endGame() {
		// mNgpd.dispose();
		mGui.dispose();
		mFlow.endgame();

	}

	/* updated on 14.11.08 by Shanmugaesan */
	/* updated on 22.12.08 by Michael Antemann */
	public void savePreferences(boolean modusA, boolean modusB,
			String spielerNameA, String spielerNameB, boolean starter,
			int denkzeit) {
		mNgpd.dispose(); // popup beenden
		mFlow.addObserver(this);
		mFlow.startGame(spielerNameA, spielerNameB, modusA, modusB, starter,
				denkzeit);

	}

	// whichKi true ist KI_A false ist KI_B
	public void setKIPreferences(boolean whichKI, int pathIndex) {
		if (whichKI) {
			mFlow.setStrategyPathA(pathIndex);
		} else {
			mFlow.setStrategyPathB(pathIndex);
		}
	}

	public void chooseKI(boolean whichTable) { // true : KItable A , false :
		// KItable B
		if (whichTable)
			strGuiA.setVisible(true);
		else
			strGuiB.setVisible(true);
	}

	public void forwardMove(int muldenIndex) {
		// move erwartet werte 0-11, ne kleine rechnung ist schneller als das
		// array umzdrehen und aneinadenr zu hänegn
		mGui.activateBoard(false, false);
		if (!mFlow.getWhoesTurn()) {
			muldenIndex = (6 - muldenIndex) + 5;
		}

		mFlow.move(muldenIndex);
	}

	public Color getColor() {
		// return new Color(219,236,193); //Nicht aendern, Verboten, Sofia :)
		return new Color(254, 207, 118); // Nicht aendern, Verboten, Sofia :)

	}

	public void run(Object arg) {
		// System.out.println("update");

		int[] pitsB = GeneralStatics.twistArray(mFlow.getPitsB());
		int[] board = GeneralStatics.connectArray(mFlow.getPitsA(), pitsB);
		int[] wPits = { mFlow.getWinPitA(), mFlow.getWinPitB() };
		// pruefe auf spielende variable oder mache rest
		// bei spiel ende zeige finish schirm mitsiegerehrung, starte neues
		// spiel?
		// System.out.println(GeneralStatics.intArrayToString(board));
		// mGui.updatePits(board);
		// mGui.updateGewinnMulden(wPits);
		// mGui.setMuldenLabel(board);
		// mGui.setGewinnMuldenLabel(wPits);
		//		

		if (mFlow.isRunning()) {
			if (arg.toString().contains("begonnen")) {
				mGui.updatePits(board);
				mGui.updateGewinnMulden(wPits);
				mGui.setMuldenLabel(board);
				mGui.setGewinnMuldenLabel(wPits);
			}

			if (arg.toString().contains("Gezogen")
					|| (arg.toString().contains("genommen"))) {
				// if (mFlow.getWhoesTurn()) {
				// mGui.updatePitsA(mFlow.getPitsA(), mTime);
				// mGui.updatePitsB(pitsB, mTime);
				// } else {
				// mGui.updatePitsB(pitsB, mTime);
				// mGui.updatePitsA(mFlow.getPitsA(), mTime);
				// }

				int choice = mFlow.getBeginning();
				int count = mFlow.getCount();

				mGui.updatePit(choice, mFlow.getPit(choice));
				choice++;
				while (count > 0) {
					if (choice % 12 == 0 && choice != 0)
						choice = 0;
					mGui.updatePit(choice, mFlow.getPit(choice));
					count--;
					choice++;
				}

				mGui.updateGewinnMulden(wPits);
				mGui.setGewinnMuldenLabel(wPits);
			}
		}

		mGui.setSpielerA(mFlow.getNameA());
		mGui.setSpielerB(mFlow.getNameB());
		mGui.setTurnImg(mFlow.getWhoesTurn());
		// leere mulden deaktivieren,
		// A ist dran und Mensch
		if (mFlow.isRunning()) {
			if (mFlow.getWhoesTurn() && !mFlow.getTypeA()) {
				mGui.activateBoard(true, false);
				mGui.deactivateBoard(true, mFlow.getPitsA());
			}
			// B ist dran und Mensch
			else if (!mFlow.getWhoesTurn() && !mFlow.getTypeB()) {
				mGui.activateBoard(false, true);
				mGui.deactivateBoard(false, pitsB);
			} else if (!mFlow.getWhoesTurn() && mFlow.getTypeB()) {
				mGui.activateBoard(false, false);
			} else if (mFlow.getWhoesTurn() && mFlow.getTypeA()) {
				mGui.activateBoard(false, false);
			}
		} else {
			mGui.activateBoard(false, false); // beide Seiten vom Brett
			// graphisch deaktivieren
		}
	}

	public void update(Observable o, Object arg) {
		mFlow.setUpdate(false);
		this.run(arg);

		if (arg != null) {
			mGui.setStatusMsg(arg.toString());
			System.out.println(arg.toString());
			if ((arg.toString().indexOf("überschritten")) != -1) {
				if (JOptionPane.showConfirmDialog(mGui, arg.toString()
						+ "\nSpiel neustarten ?", "Neues Spiel",
						JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
					mFlow.stopGame();

				}
			}
			if ((arg.toString().indexOf("Das Spiel kann begonnen werden!")) != -1)
				JOptionPane
						.showMessageDialog(mGui, "Spiel startet. Have fun !");
			if ((arg.toString().indexOf("Sieger:")) != -1) {
				JOptionPane.showMessageDialog(mGui, arg.toString());
				// JOptionPane.showConfirmDialog(mGui, "Spiel neustarten
				// ?","Neues Spiel", JOptionPane.YES_NO_OPTION);
				if (JOptionPane.showConfirmDialog(mGui, "Spiel neustarten ?",
						"Neues Spiel", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
					this.newGame();
				}
			}
		}
		mFlow.setUpdate(true);
	}

	public void showLogger() {
		logGui.truncate();
		logGui.writeIntoTextArea(mFlow.getLog());
		logGui.setVisible(true);
	}

	public void openHelp() { // updated by Sofia
		mHM.setVisible(true);
	}

	public void openAbout() {
		String aboutString = "Wari Dev Gruppe8\n" + "Gui Version:"
				+ this.version + " Game Version:" + mFlow.getVersion() + "\n"
				+ "\nEntwickler: Michael Antemann, Sofia Arndt,\n"
				+ "\tShanmugaesan Shanmugaratnam, Oleg Starodubtsev\n"
				+ "Kontakt: antemnam@gmail.com";

		JOptionPane.showMessageDialog(mGui, aboutString);
	}

	// Schreibe ins Textarea von LoggerGui
	public void writeIntoLog(String buf) {
		logGui.writeIntoTextArea(buf);
	}
}
